Szyna I2C (ang. Inter Integrated Circuit bus), choć stosunkowo mało znana, jest bardzo często stosowana w elektronice motoryzacyjnej i w sprzęcie audio-video. Ostatnimi czasy pewne odmiany szyny I2C (ACCESS.bus, Universal Serial Bus) zaczynają wkraczać do komputerów PC i zapewne niedługo, dzięki poparciu takich firm jak Intel, Microsoft, Philips, stanie się ona bardzo popularna. Dlatego warto zaznajomić się z tą bardzo ciekawą formą szeregowej szyny danych.
ˇ System składa się z co najmniej jednego mikrokontrolera i różnych urządzeń peryferyjnych, takich jak na przykład pamięci i układy wejścia/wyjścia.
ˇ Koszt dołączania różnych urządzeń musi być jak najmniejszy.
ˇ System taki spełnia zwykle zadania kontrolne w związku z czym szybki transfer danych nie jest konieczny.
ˇ Ogólna wydajność całego systemu zależy od wybranych urządzeń i szyny ich łączącej.
Aby spełnić te założenia warto zastosować strukturę opartą na szynie szeregowej, łączącej w sobie wszystkie trzy szyny: adresową, danych i sterującą. Co prawda szyna szeregowa nie dorównuje szybkością przesyłu szynie równoległej, to jednak wymaga mniejszej ilości połączeń i mniejszej ilości nóżek w układach scalonych. Zresztą szyna to nie tylko sposób łączenia układów, szyna ucieleśnia wszystkie formaty i protokoły komunikacji w obrębie systemu.
Układy komunikujące się ze sobą za pomocą szyny szeregowej muszą posługiwać się jakąś formą protokołu, która wyeliminuje możliwość kolizji sygnałów, utraty danych i zablokowania przepływu informacji. Ponadto urządzenia szybkie muszą mieć możliwość komunikowania się z układami wolniejszymi. System nie może być zależny od podłączonych do niego układów, ponieważ uniemożliwiłoby to wszelkie ewentualne modyfikacje i unowocześnienia. Poza tym jeżeli do szyny podłączone są różne układy taktowane zegarami o różnych częstotliwościach to musi być zdefiniowane źródło sygnału zegarowego szyny. Wszystkie te kryteria zostaną spełnione jeśli zastosujemy szynę I2C opracowaną i opatentowaną przez firmę Philips.
Każdy układ podłączony do szyny I2C rozpoznawany jest przez swój adres i może pracować zarówno jako nadajnik, jak i odbiornik. Oczywiście sterownik wyświetlacza LCD jest tylko odbiornikiem, ale np. pamięć może być jednym i drugim. Dodatkowo podczas transmisji podłączone układy dzielą się na master i slave. Master jest to układ inicjujący transmisję i generujący sygnał zegarowy umożliwiający tą transmisję. W tym momencie każdy zaadresowany układ jest układem slave.
Transmisja na szynie I2C jest transmisją start-stopową, tzn. każdy transfer rozpoczyna się od bitu START, po którym przesyłane są informacje (w przeciwieństwie jednak do interfejsu RS-232C ich ilość nie jest ograniczona), i kończy się bitem STOP.
Szyna I2C jest szyną typu multi-master. To znaczy, że może być podłączonych wiele układów mogących kontrolować transmisję. Zwykle układami master są mikrokontrolery. Rozpatrzmy taką sytuację, gdy podłączone są dwa mikrokontrolery. Może to wyglądać np. tak:
1. Przypuśćmy, że mikrokontroler A chce wysłać informację do mikrokontrolera B:
ˇ mikrokontroler A (master) adresuje mikrokontroler B (slave)
ˇ mikrokontroler A (nadajnik-master) wysyła dane do mikrokontrolera B (odbiornik-slave)
ˇ mikrokontroler A kończy transmisję.
2. Jeśli mikrokontroler A chce odebrać informacje od mikrokontrolera B:
ˇ mikrokontroler A (master) adresuje mikrokontroler B (slave)
ˇ mikrokontroler A (odbiornik-master) odbiera dane od mikrokontrolera B (nadajnik-slave)
ˇ mikrokontroler A kończy transmisję.
W obu przypadkach master (mikrokontroler A) generuje przebieg zegarowy oraz kończy transmisję.
Możliwość podłączenia kilku mikrokontrolerów do szyny I2C powoduje, że może zaistnieć sytuacja, w której kilka układów master chce rozpocząć transmisję w tej samej chwili. Aby uniknąć zgubienia danych stosowana jest specjalna procedura, pozwalająca wyłonić, który master będzie nadawał. Procedura ta oparta jest na funkcji galwaniczne-AND, która to wynika ze sposobu podłączenia wszystkich układów do szyny I2C.
Jeżeli dwa lub więcej układów master rozpoczyna transmisję, to układ, który pierwszy wygeneruje bit o poziomie logicznym '1', gdy inne układy generują '0', traci arbitraż. Sygnał zegarowy na linii SCL podczas procedury arbitracyjnej jest funkcją galwaniczne-AND sygnałów zegarowych generowanych przez układy master, chcące zainicjować transmisję.
Generowanie sygnału zegarowego na szynie I2C jest zawsze zadaniem układu typu master. Każdy master generuje swój własny sygnał zegarowy podczas transmisji danych. Sygnał zegarowy z układu master może być zmieniony tylko, wtedy gdy zbyt wolny układ slave wymusi poziom niski lub podczas procedury arbitracyjnej.
Dane na linii SDA muszą być stabilne podczas wysokiego poziomu sygnału zegarowego. Stan na linii danych może się zmieniać tylko podczas niskiego stanu sygnału zegarowego (na linii SCL).
Gdy na linii SDA stan logiczny zmienia się z '1' na '0', podczas gdy na linii SCL jest stan '1', to sytuacja taka nazywa się START. Natomiast gdy na linii SDA stan logiczny zmienia się z '0' na '1', podczas wysokiego poziomu na linii SCL, to sytuacja taka nazywa się STOP.
START i STOP generowane są zawsze przez układ master. Po wygenerowaniu START'u szyna jest zajęta, natomiast po wygenerowaniu STOP'u szyna jest wolna. Wykrywanie START'u i STOP'u jest łatwe, gdy podłączone urządzenia zawierają odpowiedni interfejs sprzętowy. Mikrokontrolery bez tego interfejsu, w celu wykrycia transmisji, muszą próbkować linię SDA co najmniej dwa razy w ciągu cyklu zegarowego.
Zwykle zaadresowany odbiornik musi wygenerować bit potwierdzenia, po każdym odebranym bajcie (jest jeden wyjątek, dla zachowania kompatybilności z szyną CBUS). Gdy odbiornik-slave nie może potwierdzić swojego zaadresowania (na przykład nie może odbierać, ponieważ wykonuje jakieś funkcje w czasie rzeczywistym), to musi pozostawić linię SDA w stanie wysokim. Master może wtedy wygenerować STOP, aby przerwać transmisję.
Gdy odbiornik-slave potwierdzi swoje zaadresowanie, ale potem podczas transmisji nie będzie mógł odbierać kolejnych danych, to master znowu będzie musiał przerwać transmisję. Sytuacja tak jest rozpoznawana, gdy slave nie wygeneruje bitu potwierdzenia po pierwszym kolejnym bajcie (zostawi linię SDA w stanie wysokim). Master wygeneruje wtedy sygnał STOP.
Gdy odbiornikiem jest układ master, to sygnalizuje on koniec danych nadajnikowi-slave nie generując bitu potwierdzenia po ostatnim bajcie wysłanym przez układ slave. Nadajnik-slave musi wtedy zwolnić linię danych, aby umożliwić układowi master wygenerowanie sygnału STOP.
Jeśli master pełni również funkcję slave i stracił arbitraż podczas etapu adresowania to jest możliwe, że wygrywający master próbuje go zaadresować. Master, który przegrał arbitraż musi czym prędzej przełączyć się w tryb slave.
Procedura arbitracyjna dwóch układów master pokazana jest na rysunku.
Oczywiście w arbitrażu może uczestniczyć więcej układów master (zależy ile jest podłączonych).
Kontrola szyny I2C zależy od wysłanego, przez konkurujące układy master, adresu i danych, tak więc zbędny jest jakikolwiek master centralny lub kolejność priorytetów.
Arbitraż nie może mieć miejsca między:
- powtórzonym sygnałem START i bitem danych,
- sygnałem STOP i bitem danych,
- powtórzonym sygnałem START i sygnałem STOP.
Możliwe są więc następujące formaty wysyłanych danych:
ˇ Nadajnik-master nadaje do odbiornika-slave. Kierunek transmisji jest niezmienny.
ˇ Master czyta dane od slave natychmiast po pierwszym bajcie. Po pierwszym potwierdzeniu nadajnik-master staje się odbiornikiem-master, a odbiornik-slave staje się nadajnikiem-slave. Potwierdzenie to generowane jest jeszcze przez układ slave. Bit STOP generowany jest przez układ master.
ˇ Format mieszany. Podczas zmiany kierunku nadawania, powtarzany jest bit START i adres układu slave, ale ze zmienionym bitem R/W.
Uwagi.
1. Format mieszany może być używany np. do sterowania pamięcią szeregową. Pierwszy bajt danych określa wewnętrzny adres w pamięci. Po powtórzonym bicie START i adresie układu mogą być przesłane dane.
2. To czy adres wewnątrz pamięci będzie automatycznie zwiększany, czy zmniejszany zależy od projektanta danego układu.
3. Po każdym bajcie następuje bit potwierdzenia
ˇ tryb szybki (ang. Fast-mode) - z prędkością przesyłu do 400kb/s
ˇ adresowanie 10-bitowe - pozwalające zaadresować do 1024 urządzeń.